package com.example.fileupload.storage;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.io.InputStream;
import java.util.List;

/**
 * 存储策略接口 - 函数式编程风格
 */
public interface StorageStrategy {
    
    /**
     * 存储类型
     */
    @Getter
    enum StorageType {

        LOCAL("local"),
        MINIO("minio"),
        OSS("oss");
        
        private final String value;
        
        StorageType(String value) {
            this.value = value;
        }

        public static StorageType of(String value) {
            try {
                return StorageType.valueOf(value.toUpperCase());
            } catch (Exception e) {
                return LOCAL;
            }
        }
    }
    
    /**
     * 存储结果
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    class StorageResult {
        private boolean success;
        private String path;
        private String url;
        private Long size;
        private String message;
        
        public static StorageResult success(String path, String url, Long size) {
            return new StorageResult(true, path, url, size, "上传成功");
        }
        
        public static StorageResult failure(String message) {
            return new StorageResult(false, null, null, null, message);
        }
    }
    
    /**
     * 存储文件分片
     * @param chunkPath 分片路径
     * @param inputStream 文件流
     * @param size 文件大小
     * @return 存储结果
     */
    StorageResult storeChunk(String chunkPath, InputStream inputStream, long size);
    
    /**
     * 合并文件分片
     * @param finalPath 最终文件路径
     * @param chunkPaths 分片路径列表
     * @param totalSize 总大小
     * @return 存储结果
     */
    StorageResult mergeChunks(String finalPath, java.util.List<String> chunkPaths, long totalSize);
    
    /**
     * 删除文件
     * @param path 文件路径
     * @return 删除结果
     */
    boolean deleteFile(String path);
    
    /**
     * 删除分片文件
     * @param chunkPaths 分片路径列表
     * @return 删除结果
     */
    boolean deleteChunks(List<String> chunkPaths);
    
    /**
     * 检查文件是否存在
     * @param path 文件路径
     * @return 是否存在
     */
    boolean exists(String path);
    
    /**
     * 获取文件下载URL
     * @param path 文件路径
     * @return 下载URL
     */
    String getDownloadUrl(String path);
    
    /**
     * 获取存储类型
     * @return 存储类型
     */
    StorageType getStorageType();
    
    /**
     * 生成分片路径
     * @param md5 文件MD5
     * @param chunkIndex 分片索引
     * @return 分片路径
     */
    default String generateChunkPath(String md5, int chunkIndex) {
        return String.format("chunks/%s/%d.chunk", md5, chunkIndex);
    }
    
    /**
     * 生成最终文件路径
     * @param fileName 文件名
     * @param md5 文件MD5
     * @return 文件路径
     */
    default String generateFilePath(String fileName, String md5) {
        return String.format("files/%s/%s", md5, fileName);
    }
} 